// Go作者版权所有。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package syntax

type token uint

// go：生成stringer-type标记-linecomment标记.go

const (
	_    token = iota
	_EOF       // EOF

	// 名称和文字
	_Name    // 名称
	_Literal // 字面意义的

	// 操作员和操作
	// _运算符不包括“*”（_星）
	_Operator // op
	_AssignOp // op=
	_IncOp    // opop
	_Assign   // =
	_Define   // :=
	_Arrow    // <-
	_Star     // *

	// 分隔符
	_Lparen    // (
	_Lbrack    // [
	_Lbrace    // {
	_Rparen    // )
	_Rbrack    // ]
	_Rbrace    // }
	_Comma     // ,
	_Semi      // ;
	_Colon     // :
	_Dot       // .
	_DotDotDot // ...

	// 关键词
	_Break       // 打破
	_Case        // 案例
	_Chan        // 陈
	_Const       // 常数
	_Continue    // 持续
	_Default     // 违约
	_Defer       // 推迟
	_Else        // 其他的
	_Fallthrough // 失败
	_For         // 对于
	_Func        // func
	_Go          // 去
	_Goto        // 后藤
	_If          // 如果
	_Import      // 进口
	_Interface   // 界面
	_Map         // 地图
	_Package     // 包裹
	_Range       // 范围
	_Return      // 回来
	_Select      // 选择
	_Struct      // 结构
	_Switch      // 转换
	_Type        // 类型
	_Var         // 变量

	// 空行注释将其从.String中排除
	tokenCount // None
)

const (
	// 对于BranchStmt
	Break       = _Break
	Continue    = _Continue
	Fallthrough = _Fallthrough
	Goto        = _Goto

	// 对于CallStmt
	Go    = _Go
	Defer = _Defer
)

// 确保我们最多有64个令牌，以便在一组中使用它们。
const _ uint64 = 1 << (tokenCount - 1)

// 包含报告tok是否在tokset中。
func contains(tokset uint64, tok token) bool {
	return tokset&(1<<tok) != 0
}

type LitKind uint8

// 现在允许在整数上使用带有“i”（虚构）后缀的TODO（gri）
// 和浮点数，有一个ImagLit就可以了
// 再也不能很好地表示文字类型了。移除它？
const (
	IntLit LitKind = iota
	FloatLit
	ImagLit
	RuneLit
	StringLit
)

type Operator uint

// go：生成stringer-type操作符-linecomment标记.go

const (
	_ Operator = iota

	// Def是：在：=
	Def   // :
	Not   // !
	Recv  // <-
	Tilde // ~

	// 预镜
	OrOr // ||

	// 前卢旺达
	AndAnd // &&

	// 预化学机械抛光
	Eql // ==
	Neq // !=
	Lss // <
	Leq // <=
	Gtr // >
	Geq // >=

	// 预先添加
	Add // +
	Sub // -
	Or  // |
	Xor // ^

	// 预混合
	Mul    // *
	Div    // /
	Rem    // %
	And    // &
	AndNot // &^
	Shl    // <<
	Shr    // >>
)

// 操作员先例
const (
	_ = iota
	precOrOr
	precAndAnd
	precCmp
	precAdd
	precMul
)
